﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class PessoaDocReservista
    {
        #region Variaveis Membro
        private int _idReservista;
        private int _idPessoa;
        private TipoDocReservista _tipoReservista;
        private string _numero;
        private DateTime? _dataExpedicao;
        private string _path;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdReservista
        {
            get { return _idReservista; }
            set { _idReservista = value; }
        }
        public int IdPessoa
        {
            get { return _idPessoa; }
            set { _idPessoa = value; }
        }
        public TipoDocReservista TipoReservista
        {
            get { return _tipoReservista; }
            set { _tipoReservista = value; }
        }
        public string Numero
        {
            get { return _numero; }
            set { _numero = value; }
        }
        public DateTime? DataExpedicao
        {
            get { return _dataExpedicao; }
            set { _dataExpedicao = value; }
        }
        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }
        #endregion

        #region Construtores
        public PessoaDocReservista()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public PessoaDocReservista(int idReservista)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idReservista);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        protected void Carregar(int idReservista)
        {
            try
            {
                var consulta = from r in _context.tab_pessoa_documento_reservista
                               where r.id_pessoa_reservista == idReservista
                               select new
                               {
                                   r.id_pessoa_reservista,
                                   r.tab_pessoa.Id_pessoa,
                                   r.tab_tipo_reservista.id_tipo_reservista,
                                   r.numero,
                                   r.dt_expedicao,
                                   r.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdReservista = list.id_pessoa_reservista;
                    this.IdPessoa = list.Id_pessoa;
                    this.TipoReservista = new TipoDocReservista(list.id_tipo_reservista);
                    this.Numero = list.numero;
                    this.DataExpedicao = list.dt_expedicao;
                    this.Path = list.path;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        protected void RecuperaId()
        {
            try
            {
                var consulta = from r in _context.tab_pessoa_documento_reservista
                               where r.tab_pessoa.Id_pessoa == this.IdPessoa
                               && r.tab_tipo_reservista.id_tipo_reservista == this.TipoReservista.IdTipoReservista
                               && r.numero == this.Numero
                               orderby r.id_pessoa_reservista descending
                               select r;

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdReservista = list.id_pessoa_reservista;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos

        #region Metodos de Selecao
        public List<PessoaDocReservista> SelectAll()
        {
            try
            {
                List<PessoaDocReservista> listPessoaDocReservista = new List<PessoaDocReservista>();

                var consulta = from r in _context.tab_pessoa_documento_reservista
                               orderby r.id_pessoa_reservista
                               select new
                               {
                                   r.id_pessoa_reservista,
                                   r.tab_pessoa.Id_pessoa,
                                   r.tab_tipo_reservista.id_tipo_reservista,
                                   r.numero,
                                   r.dt_expedicao,
                                   r.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaDocReservista reservista = new PessoaDocReservista();
                    reservista.IdReservista = list.id_pessoa_reservista;
                    reservista.IdPessoa = list.Id_pessoa;
                    reservista.TipoReservista = new TipoDocReservista(list.id_tipo_reservista);
                    reservista.Numero = list.numero;
                    reservista.DataExpedicao = list.dt_expedicao;
                    reservista.Path = list.path;

                    listPessoaDocReservista.Add(reservista);
                }

                return listPessoaDocReservista;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<PessoaDocReservista> SelectPorPessoa(int idPessoa)
        {
            try
            {
                List<PessoaDocReservista> listPessoaDocReservista = new List<PessoaDocReservista>();

                var consulta = from r in _context.tab_pessoa_documento_reservista
                               where r.tab_pessoa.Id_pessoa == idPessoa
                               orderby r.id_pessoa_reservista
                               select new
                               {
                                   r.id_pessoa_reservista,
                                   r.tab_pessoa.Id_pessoa,
                                   r.tab_tipo_reservista.id_tipo_reservista,
                                   r.numero,
                                   r.dt_expedicao,
                                   r.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaDocReservista reservista = new PessoaDocReservista();
                    reservista.IdReservista = list.id_pessoa_reservista;
                    reservista.IdPessoa = list.Id_pessoa;
                    reservista.TipoReservista = new TipoDocReservista(list.id_tipo_reservista);
                    reservista.Numero = list.numero;
                    reservista.DataExpedicao = list.dt_expedicao;
                    reservista.Path = list.path;

                    listPessoaDocReservista.Add(reservista);
                }

                return listPessoaDocReservista;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persistencia
        public void Salvar()
        {
            if (this.IdReservista == 0)
            {
                tab_pessoa_documento_reservista tabReservista = new tab_pessoa_documento_reservista();

                tabReservista.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                tabReservista.tab_tipo_reservistaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_reservista", "id_tipo_reservista", this.TipoReservista.IdTipoReservista);
                tabReservista.numero = this.Numero;
                tabReservista.dt_expedicao = this.DataExpedicao;

                _context.AddTotab_pessoa_documento_reservista(tabReservista);
                _context.SaveChanges();

                RecuperaId();
            }
            else
            {
                tab_pessoa_documento_reservista tabReservista = (from r in _context.tab_pessoa_documento_reservista
                                                                 where r.id_pessoa_reservista == this.IdReservista
                                                                 select r).First();

                tabReservista.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                tabReservista.tab_tipo_reservistaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_reservista", "id_tipo_reservista", this.TipoReservista.IdTipoReservista);
                tabReservista.numero = this.Numero;
                tabReservista.dt_expedicao = this.DataExpedicao;

                _context.SaveChanges();
            }
        }
        public void AtualizaPath()
        {
            try
            {
                if (this.IdReservista != 0)
                {
                    tab_pessoa_documento_reservista tabReservista = (from r in _context.tab_pessoa_documento_reservista
                                                                     where r.id_pessoa_reservista == this.IdReservista
                                                                     select r).First();

                    tabReservista.path = this.Path;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
